import axios from 'axios'
import qs from 'qs'
import { Notify } from 'vant'
import { VueAxios } from './axios'

/**
 * 创建 axios 实例
 */
const request = axios.create({
  // API 请求的默认前缀
  baseURL: process.env.VUE_APP_API_URL,
  timeout: 6000, // 请求超时时间
})

/**
 * 异常拦截处理器
 * @param {*} error 
 * @returns 
 */
const errorHandler = (error) => {
  if (error.response) {
    switch (error.response.data.code) {
      case 403:
        Notify({ message: '系统提示', type: 'danger' })
        break
      case 500:
        let type = error.response.request.responseType
        if(type === 'blob'){
          blobToJson(data)
          break
        }
        Notify({ message: error.response.data.message, type: 'danger' })
        break
      case 404:
        Notify({ message: '很抱歉，资源未找到!', type: 'danger' })
        break
      case 504:
        Notify({ message: '网络超时', type: 'danger' })
        break
      case 401:
        Notify({ message: '未授权，请重新登录', type: 'danger' })
        break
      default:
        Notify({ message: error.response.data.message, type: 'danger' })
        break
    }
  }
  return Promise.reject(error)
}

/**
 * request interceptor
 */
request.interceptors.request.use(config => {
  // 追加共通参数
  if (config.method.toUpperCase === 'POST') {
    config.data['dateTime'] = new Date().getTime()
  }

  // JSON转formData格式
  // if (config.data) {
  //   config.data = qs.stringify(config.data)
  // }
  // 设置请求头
  config.headers['Content-Type'] = 'application/json'
  return config
}, errorHandler)

/**
 * response interceptor
 */
request.interceptors.response.use((response) => {
  switch (response.data.code) {
    case 200:
      return response.data
    case 403:
      Notify({ message: '系统提示', type: 'danger' })
      break
    case 500:
      let type = response.request.responseType;
      if(type === 'blob'){
        blobToJson(data)
        break
      }
      Notify({ message: response.data.message, type: 'danger' })
      break
    case 404:
      Notify({ message: '很抱歉，资源未找到!', type: 'danger' })
      break
    case 504:
      Notify({ message: '网络超时', type: 'danger' })
      break
    case 401:
      Notify({ message: '未授权，请重新登录', type: 'danger' })
      break
    default:
      Notify({ message: response.data.message, type: 'danger' })
      break
  }
}, errorHandler)

const installer = {
  vm: {},
  install (Vue) {
    Vue.use(VueAxios, request)
  },
}

/**
 * blob格式转化
 * @param {*} data 
 */
function blobToJson(data) {
  let fileReader = new FileReader()
  let token = Vue.ls.get(ACCESS_TOKEN)
  fileReader.onload = function() {
    try {
      // 说明是普通对象数据，后台转换失败
      let jsonData = JSON.parse(this.result)
      console.log("jsonData", jsonData)
      if (jsonData.status === 500) {
        console.log("token----------》", token)
        if(token && jsonData.message.includes("Token失效")){
          Modal.error({
            title: '登录已过期',
            content: '很抱歉，登录已过期，请重新登录',
            okText: '重新登录',
            mask: false,
            onOk: () => {
              store.dispatch('Logout').then(() => {
                Vue.ls.remove(ACCESS_TOKEN)
                window.location.reload()
              })
            },
          })
        }
      }
    } catch (err) {
      // 解析成对象失败，说明是正常的文件流
      console.log("blob解析fileReader返回err", err)
    }
  }
  fileReader.readAsText(data)
}

export default request

export {
  installer as VueAxios,
  request as axios,
}